package com.qf3.advices;

import org.aspectj.lang.ProceedingJoinPoint;

import java.lang.reflect.Method;

/**
 * 封装增强逻辑的对象 -- 通知对象
 */
public class ServiceAdvice {

    //在目标方法之前执行--前置通知
    public void before(){
        System.out.println("before....");
    }

    //在目标方法执行结束后执行，不管是正常结束还是异常结束 -- 最终通知
    public void after(){
        System.out.println("after....");
    }

    //在目标方法正常执行完后执行 -- 返回后通知
    public void afterReturning(){
        System.out.println("afterReturning....");
    }

    //在目标方法出现异常后执行 -- 异常通知
    public void afterThrowing(){
        System.out.println("afterThrowing....");
    }

    //具体是否要执行目标方法，需要我们在这个方法中确定 -- 环绕通知
    public Object around_my(Object obj, Method method,Object[] args){
        System.out.println("around....");
        return null;
    }

    /**
     * 可以实现我们上面介绍的所有通知类型
     *
     * 环绕通知细节： 返回值必须是Object，方法参数必须是ProceedingJoinPoint（内部封装了目标对象、目标方法、目标方法的参数）
     * @param pjp
     * @return
     */
    public Object around(ProceedingJoinPoint pjp){
        System.out.println("around....");

        Object proceed = null;
        try {
            before();
            //调用目标方法
            proceed = pjp.proceed();  //method.invoke(obj,args);

            afterReturning();
        } catch (Throwable e) {
            e.printStackTrace();
            afterThrowing();
        }finally {
            after();
        }

        return proceed;
    }

}
